package vista.ventanaPrincipal;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
import modelo.SistemaPrincipal;
import vista.tableModel.TableModelProyecto;
import vista.ventanaProyecto.AgregarUsuarioAlProyecto;
import vista.ventanaProyecto.CrearProyecto;
import vista.ventanaProyecto.VerUsuariosDelProyecto;
import vista.ventanaTarea.VerTareas;
/**
 * @author rocio
 * */
public class VentanaPrincipal extends JFrame implements Observer{

	// Variables  *********************************************************** //

	private static final long serialVersionUID = 7572120740560079210L;
	private SistemaPrincipal model;
	private JButton verTarea, verUsuario, agregarUsuario, agregar, eliminar, botonSalir;
	private JTable tablaDeProyectos; 
	private JPanel panel, panel2; 
	private TableModelProyecto tableModel;
	
	// Constructor  *********************************************************** //

	public VentanaPrincipal(SistemaPrincipal model){
		super("Ventana Principal");
		this.model = model;
		this.model.addObserver(this);
		this.init();
		this.agregarComponentes(); 
	
	}
	
	// Metodos  *********************************************************** //

	/**
	 * Inicializa los componentes
	 */
	public void init(){
		this.verTarea = new JButton ("Ver tareas");
		this.verUsuario = new JButton ("Ver usuarios");
		this.agregarUsuario=new JButton("Agregar Usuario");  
		this.agregar= new JButton ("Crear    ");
		this.eliminar= new JButton("Eliminar"); 
		this.botonSalir = new JButton ("Salir");
		this.panel= new JPanel ();
		this.panel2 = new JPanel(); 
	}
	
	
	/**
	 * Crea la tabla de proyectos
	 */
	public void crearTabla (){

        // creamos el modelo de Tabla
		this.tableModel = new TableModelProyecto();
        // se crea la Tabla con el modelo 
		this.tablaDeProyectos = new JTable (this.tableModel); 
		//creo las columnas
		this.tableModel.addColumn( "Nombre Proyecto"); 
		//creo las filas
		this.tableModel.actualizarme(model.getProyectos());
		 //se define el tamanio
		this.tablaDeProyectos.setPreferredScrollableViewportSize(new Dimension(500, 70));

        //Creamos un JscrollPane y le agregamos la JTable
        JScrollPane scrollPane = new JScrollPane(tablaDeProyectos);

        //Agregamos el JScrollPane al contenedor
        this.getContentPane().add(scrollPane, BorderLayout.CENTER);
	}
	

	/**
	 * Agrega los componentes al frame 
	 */
	public void agregarComponentes(){
		this.getContentPane().setLayout(new BorderLayout());
		this.crearTabla (); 
		//Botones al sur
		this.panel.add(verTarea);
		this.panel.add(verUsuario);
		this.panel.add(agregarUsuario);
		this.panel.add(botonSalir);
		//Botones al Este
		this.panel2.setLayout(new BoxLayout(panel2, BoxLayout.Y_AXIS));
		this.panel2.add(agregar);
		this.panel2.add(eliminar);
		
		//dar funcionalidad a los botones
		this.botonSalir.addActionListener(new BotonCancelarListener ()); 
		this.verTarea.addActionListener(new BotonAbrirTareasListener ());
		this.verUsuario.addActionListener(new BotonVerUsuarioListener ());
		this.agregarUsuario.addActionListener(new BotonAgregarUsuario());
		this.agregar.addActionListener(new BotonAgregarListener());
		this.eliminar.addActionListener(new BotonEliminarListener());
		//agrego los panel
		this.add(panel, BorderLayout.SOUTH); 
		this.add(panel2 , BorderLayout.EAST); 
		//seteo las propiedades de la ventana
		this.pack();
		this.setSize(500, 200);
		this.setVisible(true);
	}
	
	
	/**
	 * Boton que cierra la aplicacion
	 */
	public class BotonCancelarListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			VentanaPrincipal.this.dispose();
		}
	}
	
	
	/**
	 *Boton que abre ventana de las tareas del proyecto 
	 */
	public class BotonAbrirTareasListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				 new VerTareas(VentanaPrincipal.this.model.getProyectos().get(tablaDeProyectos.getSelectedRow())); 
			}	
			catch(Exception e){
				JOptionPane.showMessageDialog(panel, "Seleccione el proyecto primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
	
	/**
	 * Boton que abre ventana de los usuarios del proyecto 
	 */
	public class BotonVerUsuarioListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				VerUsuariosDelProyecto usuariosDelProyecto= new VerUsuariosDelProyecto(
						VentanaPrincipal.this.model.getProyectos().get(tablaDeProyectos.getSelectedRow()));
				//Pone un titulo a la ventana
				 usuariosDelProyecto.setTitle("Usuarios de: " + 
						 VentanaPrincipal.this.model.getProyectos().get(tablaDeProyectos.getSelectedRow()).getNombre());
			}	
			catch(Exception e){
				JOptionPane.showMessageDialog(panel, "Seleccione el proyecto primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	
	/**
	 * Boton que agrega un nuevo proyecto   
	 */
	public class BotonAgregarListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			//agrega  proyecto
			tableModel.getDataVector().removeAllElements();
			new CrearProyecto (model);
		}
	}
	

	/**
	 * Boton que elimina un proyecto
	 */
	public class BotonEliminarListener implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				//remueve el proyecto
				VentanaPrincipal.this.model.getProyectos().remove(tablaDeProyectos.getSelectedRow());
				tableModel.getDataVector().remove(tableModel.getDataVector().get(tablaDeProyectos.getSelectedRow()));
				tablaDeProyectos.updateUI();
			}
			catch(Exception e){
				JOptionPane.showMessageDialog(panel, "Seleccione un proyecto primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	
	
	/**
	 * Boton que agrega un usuario al proyecto
	 */
	public class BotonAgregarUsuario implements ActionListener {
		public void actionPerformed(ActionEvent arg0) {
			try{
				//pide la ventada de todos los usuarios q al seleccionar uno lo agerga al proyecto
				AgregarUsuarioAlProyecto agregarUsuario=new AgregarUsuarioAlProyecto(model.getProyectos().get(tablaDeProyectos.getSelectedRow()), VentanaPrincipal.this.model);
				//Pone un titulo a la ventana
				agregarUsuario.setTitle("Usuarios del Sistema");
			}
			catch(Exception e){
				JOptionPane.showMessageDialog(panel, "Seleccione un proyecto primero",
						"Mensaje", JOptionPane.ERROR_MESSAGE);
			}
		}
	}

	
	/**
	 * Actualiza la tabla
	 */
	@Override
	public void update(Observable o, Object arg) {
		tableModel.actualizarme(this.model.getProyectos());
		this.validate();
	}
}
